package Demo3;

import Demo2.HashBuck;

import java.util.Objects;

class Person{
    public String id;

    public Person(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(id, person.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }
}
public class HushBuck2<K,V> {
    static class Node<K,V>{
        public K key;
        public V val;
        public Node<K,V> next;

        public Node(K key, V val) {
            this.key = key;
            this.val = val;
        }
    }
    public Node<K,V>[] arr;
    public  int usedSized;

    public HushBuck2() {
        this.arr = (Node<K,V>[])new Node[10];
    }
    public void put(K key,V val){
        int hash = key.hashCode();
        int index = hash % arr.length;
        Node<K,V> cur = arr[index];
        while (cur != null){
            if(cur.key.equals(key)){
                cur.val = val;
                return;
            }
            cur = cur.next;
        }
        Node<K,V> node = new Node<>(key, val);
        node.next = arr[index];
        arr[index] = node;
        usedSized++;
        if(loadFactor()>=0.75){
            resize();
        }
    }
    private void resize() {
        Node[] tmpArr = new Node[arr.length*2];
        //遍历原来的数组  将所有的元素   《重新哈希》到新的数组中
        for (int i = 0; i < arr.length; i++) {
           Node cur = arr[i];
            while(cur != null){
                //记录下当前节点的下一个节点
                Node curNext = cur.next;
                int hash = cur.key.hashCode();
                int newIndex = hash % tmpArr.length;
                //头插法
                cur.next = tmpArr[newIndex];
                tmpArr[newIndex] = cur;
                cur = curNext;
            }
        }
        arr = tmpArr;
    }

    private double loadFactor(){
        return usedSized*1.0 / arr.length;
    }
    public V get(K key){
        int hash = key.hashCode();
        int index = hash % arr.length;
        Node cur = arr[index];
        while(cur != null){
            if(cur.key.equals(key)){
                return (V) cur.val;
            }
        }
        return null;
    }
}
